﻿using System;
using System.Collections.Generic;
using System.Configuration.Provider;

namespace AnOtherBlog.Core.Providers
{
	/// <summary>
	/// Clase base para todos los proveedores de datos
	/// </summary>
	public abstract class DataProvider : ProviderBase
	{

		// TODO: Aquí hay que declarar todos los metodos de acceso a datos

		#region Blog Data Access
		///// <summary>
		///// Obtiene la configuración de un blog de acuerdo a su id
		///// </summary>
		///// <param name="id">Identificador del blog</param>
		///// <returns>Blog</returns>
		//public abstract Blog BlogSelect(int id);

		/// <summary>
		/// Obtiene la configuración de un blog de acuerdo a su dominio
		/// </summary>
		/// <param name="domain">Dominio del blog</param>
		/// <returns>Blog</returns>
		public abstract Blog BlogSelect(string domain);

		/// <summary>
		/// Inserta la configuración de un blog
		/// </summary>
		/// <param name="blog">Blog a insertar</param>
		public abstract void BlogInsert(Blog blog);

		/// <summary>
		/// Modifica la configuración de un blog
		/// </summary>
		/// <param name="blog">Blog a modificar</param>
		public abstract void BlogUpdate(Blog blog);

		#endregion

		#region Category Data Access
		/// <summary>
		/// Obtiene una categoría
		/// </summary>
		/// <param name="id">Identificador de la categoría</param>
		/// <returns>Categoria</returns>
		public abstract Category CategorySelect(Guid id);

		/// <summary>
		/// Inserta una categoría
		/// </summary>
		/// <param name="category">Categoría a insertar</param>
		public abstract void CategoryInsert(Category category);

		/// <summary>
		/// Modifica una categoría
		/// </summary>
		/// <param name="category">Categoría a modificar</param>
		public abstract void CategoryUpdate(Category category);

		/// <summary>
		/// Suprime una categoría
		/// </summary>
		/// <param name="category">Categoría a suprimir</param>
		public abstract void CategoryDelete(Category category);

		/// <summary>
		/// Obtiene la lista de todas las categorías
		/// </summary>
		/// <returns>Colección de categorías</returns>
		public abstract List<Category> CategoryList();

		#endregion

		#region Page Data Access
		/// <summary>
		/// Obtiene una página
		/// </summary>
		/// <param name="id">Identificador de la página</param>
		/// <returns>Página</returns>
		public abstract Page PageSelect(Guid id);

		/// <summary>
		/// Inserta una página
		/// </summary>
		/// <param name="page">Página a insertar</param>
		public abstract void PageInsert(Page page);

		/// <summary>
		/// Modifica una página
		/// </summary>
		/// <param name="page">Página a modificar</param>
		public abstract void PageUpdate(Page page);

		/// <summary>
		/// Suprime una página
		/// </summary>
		/// <param name="page">Página a suprimir</param>
		public abstract void PageDelete(Page page);

		/// <summary>
		/// Obtiene la lista de todas las páginas
		/// </summary>
		/// <returns>Colección de páginas</returns>
		public abstract List<Page> PageList();

		/// <summary>
		/// Obtiene la lista de todas las páginas
		/// </summary>
		/// <param name="isProxy">Modo de carga true=lectura reducida</param>
		/// <returns>Colección de páginas</returns>
		public abstract List<Page> PageList(bool isProxy);

		#endregion

		#region Post Data Access
		/// <summary>
		/// Obtiene una publicación
		/// </summary>
		/// <param name="id">Identificador de la publicación</param>
		/// <returns>Post</returns>
		public abstract Post PostSelect(Guid id);

		/// <summary>
		/// Inserta una publicación
		/// </summary>
		/// <param name="post">Publicación a insertar</param>
		public abstract void PostInsert(Post post);

		/// <summary>
		/// Modifica una publicacíon
		/// </summary>
		/// <param name="post">Publicación a modificar</param>
		public abstract void PostUpdate(Post post);

		/// <summary>
		/// Suprime una publicacíon
		/// </summary>
		/// <param name="post">Publicacíon a suprimir</param>
		public abstract void PostDelete(Post post);

		/// <summary>
		/// Obtiene la lista de todas las publicaciones
		/// </summary>
		/// <returns>Colección de publicaciones</returns>
		public abstract List<Post> PostList();

		/// <summary>
		/// Obtiene la lista de todas las publicaciones
		/// </summary>
		/// <param name="isProxy">Modo de carga true=lectura reducida</param>
		/// <returns>Colección de publicaciones</returns>
		public abstract List<Post> PostList(bool isProxy);

		#endregion

		#region Comment Data Access
		/// <summary>
		/// Obtiene un comentario
		/// </summary>
		/// <param name="id">Identificador del comentario </param>
		/// <returns>Comment</returns>
		public abstract Comment CommentSelect(Guid id);

		/// <summary>
		/// Inserta un comentario
		/// </summary>
		/// <param name="comment">Comentario a insertar</param>
		public abstract void CommentInsert(Comment comment);

		/// <summary>
		/// Modifica un comentario
		/// </summary>
		/// <param name="comment">Comentario a modificar</param>
		public abstract void CommentUpdate(Comment comment);

		/// <summary>
		/// Suprime un comentario
		/// </summary>
		/// <param name="comment">comentario a suprimir</param>
		public abstract void CommentDelete(Comment comment);

		///// <summary>
		///// Obtiene la lista de todas las publicaciones
		///// </summary>
		///// <returns>Colección de publicaciones</returns>
		//public abstract List<Post> PostList();

		///// <summary>
		///// Obtiene la lista de todas las publicaciones
		///// </summary>
		///// <param name="isProxy">Modo de carga true=lectura reducida</param>
		///// <returns>Colección de publicaciones</returns>
		//public abstract List<Post> PostList(bool isProxy);

		#endregion

	}

}
